
#include "main.h"


#define gpio_STATUS_CLK		RCC_AHB1Periph_GPIOB
#define gpio_STATUS_PORT	GPIOB
#define gpio_STATUS_PIN		GPIO_Pin_5

#if		defined(BSP_DEVICE_TOUCH)
#define gpio_BUZZER_CLK		RCC_AHB1Periph_GPIOC
#define gpio_BUZZER_PORT	GPIOC
#define gpio_BUZZER_PIN		GPIO_Pin_13

#define gpio_PORT1_CLK		RCC_AHB1Periph_GPIOB
#define gpio_PORT1_PORT		GPIOB
#define gpio_PORT1_PIN		GPIO_Pin_12

#define gpio_PORT2_CLK		RCC_AHB1Periph_GPIOB
#define gpio_PORT2_PORT		GPIOB
#define gpio_PORT2_PIN		GPIO_Pin_13

#define gpio_PORT3_CLK		RCC_AHB1Periph_GPIOB
#define gpio_PORT3_PORT		GPIOB
#define gpio_PORT3_PIN		GPIO_Pin_14

#define gpio_PORT4_CLK		RCC_AHB1Periph_GPIOB
#define gpio_PORT4_PORT		GPIOB
#define gpio_PORT4_PIN		GPIO_Pin_15
#endif	//BSP_DEVICE_TOUCH

const static struct
{
	uint16_t		Pin;
	GPIO_TypeDef*	Port;
} _leds[eLED_MAX] = {
	{gpio_STATUS_PIN, gpio_STATUS_PORT},

#if		defined(BSP_DEVICE_TOUCH)
	{gpio_BUZZER_PIN, gpio_BUZZER_PORT},
	{gpio_PORT1_PIN, gpio_PORT1_PORT},
	{gpio_PORT2_PIN, gpio_PORT2_PORT},
	{gpio_PORT3_PIN, gpio_PORT3_PORT},
	{gpio_PORT4_PIN, gpio_PORT4_PORT},
#endif	//BSP_DEVICE_TOUCH
};


void Led_Init(void)
{
	GPIO_INIT gis[] =
	{
		{gpio_STATUS_CLK, {gpio_STATUS_PIN, GPIO_Mode_OUT, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_DOWN}, gpio_STATUS_PORT,},

#if		defined(BSP_DEVICE_TOUCH)
		{gpio_BUZZER_CLK, {gpio_BUZZER_PIN, GPIO_Mode_OUT, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_DOWN}, gpio_BUZZER_PORT,},
		{gpio_PORT1_CLK, {gpio_PORT1_PIN, GPIO_Mode_OUT, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_DOWN}, gpio_PORT1_PORT,},
		{gpio_PORT2_CLK, {gpio_PORT2_PIN, GPIO_Mode_OUT, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_DOWN}, gpio_PORT2_PORT,},
		{gpio_PORT3_CLK, {gpio_PORT3_PIN, GPIO_Mode_OUT, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_DOWN}, gpio_PORT3_PORT,},
		{gpio_PORT4_CLK, {gpio_PORT4_PIN, GPIO_Mode_OUT, GPIO_Speed_50MHz, GPIO_OType_PP, GPIO_PuPd_DOWN}, gpio_PORT4_PORT,},
#endif	//BSP_DEVICE_TOUCH
	};
	u32 i;

	Util_GpioInit(gis, _countof(gis));
	for (i=0; i<_countof(gis); i++)
		Led_Set((LED_TYPE)i, 0);
}

void Led_Set(u8 led, u8 on)
{
	if (eLED_MAX > (LED_TYPE)led)
	{
		if (on)
			_leds[led].Port->BSRRL = _leds[led].Pin;
		else
			_leds[led].Port->BSRRH = _leds[led].Pin;
	}
}

void Led_Toggle(u8 led)
{
	if (eLED_MAX > (LED_TYPE)led)
	{
		if (_leds[led].Port->ODR & _leds[led].Pin)
			Led_Set(led, 0);
		else
			Led_Set(led, 1);
	}
}

